﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using PSE.Framework.UI.Resources;

namespace PSE.Framework.UI.Controls.SmartClient
{
	#region Enums
	#region MessageBoxButton
	/// <summary>
	/// Tipos de botões que serão exibidos na janela de mensagem
	/// </summary>
	public enum MessageBoxButton
	{
		Ok = 0,
		OkCancel = 1,
		YesNo = 2,
		YesNoCancel = 3
	}
	#endregion

	#region MessageBoxResult
	/// <summary>
	/// Valor do botão pressionado pelo usuário na janela de mensagem
	/// </summary>
	public enum MessageBoxResult
	{
		Ok = 0,
		Cancel = 1,
		Yes = 2,
		No = 3,
		None = 4
	}
	#endregion

	#region MessageBoxImage
	/// <summary>
	/// Tipos de imagens que serão exibidas na janela de mensagem
	/// </summary>
	public enum MessageBoxImage
	{
		Error = 0,
		Question = 1,
		Exclamation = 2,
		Information = 3,
		None = 4
	}
	#endregion

	public enum MessageBoxState
	{
		Opened,
		Closed
	}

	#endregion

	/// <summary>
	/// Componente de Mensagens do sistema 
	/// </summary>
	public class MessageBox : Control
	{
		#region Properties
		/// <summary>
		/// Armazenará o valor do botão pressionado pelo usuário
		/// </summary>
		public MessageBoxResult Retorno { get; set; }

		private const string DEFAULT_TITLE = "Infra.Controls.Label.DefaultMessageBoxTitle";

		#endregion

		#region Constructor
		/// <summary>
		/// Construtor padrão
		/// </summary>
		static MessageBox()
		{
		}
		#endregion

		#region Static Methods
		/// <summary>
		/// Exibe janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem a ser exibida na janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
		public static MessageBoxResult Show(String message)
		{
			return Show(message, DEFAULT_TITLE, MessageBoxButton.Ok, MessageBoxImage.None);
		}

		/// <summary>
		/// Exibe janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem que será exibida na janela</param>
		/// <param name="title">Título da janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
		public static MessageBoxResult Show(String message, String title)
		{
			return Show(message, title, MessageBoxButton.Ok, MessageBoxImage.None);
		}

		/// <summary>
		/// Exibe a janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem que será exibida na janela</param>
		/// <param name="title">Título da janela</param>
		/// <param name="MessageBoxButton">Conjunto de botões que serão exibidos na janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
        public static MessageBoxResult Show(String message, String title, SmartClient.MessageBoxButton messageBoxButton)
		{
			return Show(message, title, messageBoxButton, MessageBoxImage.None);
		}

		/// <summary>
		/// Exibe janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem que será exibida janela</param>
		/// <param name="MessageBoxButton">Conjunto de botões que serão exibidos na janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
        public static MessageBoxResult Show(String message, SmartClient.MessageBoxButton messageBoxButton)
		{
			return Show(message, DEFAULT_TITLE, messageBoxButton, MessageBoxImage.None);
		}

		/// <summary>
		/// Exibe janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem que será exibida na janela</param>
		/// <param name="title">Título da janela</param>
		/// <param name="MessageBoxImage">Imagem que será exibida na janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
        public static MessageBoxResult Show(String message, String title, SmartClient.MessageBoxImage messageBoxImage)
		{
			return Show(message, title, MessageBoxButton.Ok, messageBoxImage);
		}

		/// <summary>
		/// Exibe janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem que será exibida na janela</param>
		/// <param name="MessageBoxImage">Imagem que será exibida na janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
        public static MessageBoxResult Show(String message, SmartClient.MessageBoxImage messageBoxImage)
		{
			return Show(message, DEFAULT_TITLE, MessageBoxButton.Ok, messageBoxImage);
		}

		/// <summary>
		/// Exibe janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem que será exibida na janela</param>
		/// <param name="MessageBoxButton">Conjunto de botões que serão exibidos na janela</param>
		/// <param name="MessageBoxImage">Imagem que será exibida na janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
        public static MessageBoxResult Show(String message, SmartClient.MessageBoxButton messageBoxButton, SmartClient.MessageBoxImage messageBoxImage)
		{
			return Show(message, DEFAULT_TITLE, messageBoxButton, messageBoxImage);
		}

        public static MessageBoxResult Show(String message, String title, SmartClient.MessageBoxButton messageBoxButton, SmartClient.MessageBoxImage messageBoxImage)
		{
			return Show(message, title, messageBoxButton, messageBoxImage, null, null);
		}

		/// <summary>
		/// Exibe janela de mensagem
		/// </summary>
		/// <param name="message">Mensagem que será exibida na janela</param>
		/// <param name="title">Título da janela</param>
		/// <param name="MessageBoxButton">Conjunto de botões que serão exibidos na janela</param>
		/// <param name="MessageBoxImage">Imagem que será exibida na janela</param>
		/// <returns>Valor do botão pressionado pelo usuário</returns>
        public static MessageBoxResult Show(String message, String title, SmartClient.MessageBoxButton messageBoxButton, SmartClient.MessageBoxImage messageBoxImage, double? windowHeight, double? windowWidth)
		{
			MessageBoxWindow msg = new MessageBoxWindow(message, title, messageBoxButton, messageBoxImage, windowHeight, windowWidth);
			MessageBoxResult result;

			// Estilo default
			if (msg.Template != null)
			{
				if (msg.Title == DEFAULT_TITLE)
				{
					msg.Title = (string)ResourceProviderManager.GetResourceProvider().TryGetResource(msg.Title);
				}

				if (OnMessageBoxStateChanged != null)
					OnMessageBoxStateChanged(MessageBoxState.Opened);

				System.Windows.Threading.Dispatcher.CurrentDispatcher
					.Invoke(new Action(delegate() { msg.ShowDialog(); }), null);

				result = msg.Retorno;

				if (OnMessageBoxStateChanged != null)
					OnMessageBoxStateChanged(MessageBoxState.Closed);

				msg = null;
			}
			else
			{
				string caption = title;

				if (caption == DEFAULT_TITLE)
				{
					caption = (string)ResourceProviderManager.GetResourceProvider().TryGetResource(caption);
				}

                System.Windows.MessageBoxButton button;
				switch (messageBoxButton)
				{
					case SmartClient.MessageBoxButton.Ok:
                        button = System.Windows.MessageBoxButton.OK;
						break;
                    case SmartClient.MessageBoxButton.OkCancel:
						button = System.Windows.MessageBoxButton.OKCancel;
						break;
                    case SmartClient.MessageBoxButton.YesNo:
                        button = System.Windows.MessageBoxButton.YesNo;
						break;
                    case SmartClient.MessageBoxButton.YesNoCancel:
                        button = System.Windows.MessageBoxButton.YesNoCancel;
						break;
					default:
                        button = System.Windows.MessageBoxButton.OK;
						break;
				}

                System.Windows.MessageBoxImage icon;
				switch (messageBoxImage)
				{
                    case SmartClient.MessageBoxImage.Error:
                        icon = System.Windows.MessageBoxImage.Error;
						break;
                    case SmartClient.MessageBoxImage.Question:
                        icon = System.Windows.MessageBoxImage.Question;
						break;
                    case SmartClient.MessageBoxImage.Exclamation:
                        icon = System.Windows.MessageBoxImage.Exclamation;
						break;
                    case SmartClient.MessageBoxImage.Information:
                        icon = System.Windows.MessageBoxImage.Information;
						break;
                    case SmartClient.MessageBoxImage.None:
                        icon = System.Windows.MessageBoxImage.None;
						break;
					default:
                        icon = System.Windows.MessageBoxImage.None;
						break;
				}

				// MessageBox normal
                System.Windows.MessageBoxResult r = System.Windows.MessageBox.Show(message, caption, button, icon);

				switch (r)
				{
                    case System.Windows.MessageBoxResult.OK:
						result = SmartClient.MessageBoxResult.Ok;
						break;
                    case System.Windows.MessageBoxResult.Cancel:
                        result = SmartClient.MessageBoxResult.Cancel;
						break;
                    case System.Windows.MessageBoxResult.Yes:
                        result = SmartClient.MessageBoxResult.Yes;
						break;
                    case System.Windows.MessageBoxResult.No:
                        result = SmartClient.MessageBoxResult.No;
						break;
                    case System.Windows.MessageBoxResult.None:
                        result = SmartClient.MessageBoxResult.None;
						break;
					default:
                        result = SmartClient.MessageBoxResult.None;
						break;
				}
			}


			return result;
		}
		#endregion

		#region Static Events
		public delegate void OnMessageBoxStateChangedEventHandler(MessageBoxState state);
		public static event OnMessageBoxStateChangedEventHandler OnMessageBoxStateChanged;
		#endregion
	}
}